<?php
/**
 * Created by PhpStorm.
 * User: hexvliang
 * Date: 15/7/29
 * Time: 下午4:58
 */

namespace Common\Common;

/**
 *  数组操作工具
 * Class ArrayTools
 * @package App\Lib
 */
class ArrayTools
{

    /**
     * 取出二维数组中的一列
     * @param $array
     * @param $key
     * @return array|bool
     */
    public static function getArrayByKey($array, $key)
    {
        if (!is_array($array)) {
            return false;
        }
        if(empty($array)){
            return array();
        }
        if (function_exists('array_column')) {
            return array_column($array, $key);
        }
        $data = array();
        foreach ($array as $val) {

            if (isset($val[$key])) {
                $data[] = $val[$key];
            }
        }
        return $data;
    }


    /**
     * 通过数组的键来进行联表 和array1中的数据条数一致   只对一对一关系有效
     * @param $array1
     * @param $array2
     * @param $key
     * @param bool $identical  是否恒等.当时true的时候判断类型
     * @return array
     */
    public static function mergeArray($array1, $array2, $key,$identical=false)
    {
        $ret = array();
        if (!is_array($array1) || !is_array($array2)) {
            return false;
        }

        foreach ($array1 as $key1 => $value1) {
            $mValue1 = isset($value1[$key]) ? $value1[$key] : null;
            if ($mValue1 === null) {
                array_push($ret, $value1);
                continue;
            }
            $tmp=array();
            foreach ($array2 as $key2 => $value2) {

                $mValue2 = isset($value2[$key]) ? $value2[$key] : null;

                if($identical){

                    if ($mValue2 !== null && $mValue2 === $mValue1) {
                        unset($array2[$key2]);
                        $tmp=array_merge($value1, $value2);
                        continue;
                    }
                }else{

                    if ($mValue2 !== null && $mValue2 == $mValue1) {

                        unset($array2[$key2]);
                        $tmp=array_merge($value1, $value2);
                        continue;
                    }
                }
            }

            if(empty($tmp)){
                $tmp=$value1;
            }
            array_push($ret, $tmp);
        }
        return $ret;
    }

    /**
     * 不同key 的数组联表结果和array1的记录条数为准
     * @param $array1
     * @param $key1
     * @param $array2
     * @param $key2
     * @return array|bool
     */
    public static function mergeArrayDiffKey($array1, $key1, $array2, $key2)
    {
        if (!is_array($array1) || !is_array($array2) || !is_string($key1) || !is_string($key2)) {
            return false;
        }
        $data = array();
        foreach ($array1 as $key => $value) {
            $data_ = $value;
            if (isset($value[$key1])) {
                foreach ($array2 as $key_ => $value_) {
                    if (isset($value_[$key2]) && $value_[$key2] === $value[$key1]) {
                        $data_ = array_merge($value, $value_);
                        unset($array2[$key_]);
                    }
                }
            }
            $data[] = $data_;
        }
        return $data;
    }


    /**
     * 从二维数组中找key满足值的一条记录(不影响)原来的数组
     * @param $data array
     * @param $key string
     * @param $value string|int
     * @return bool
     */
    public static function getOneItem($data, $key, $value)
    {
        if (!is_array($data)) {
            return false;
        }
        foreach ($data as $one) {
            if (isset($one[$key]) && $one[$key] === $value) {
                return $one;
            }
        }
        return array();
    }

    /**
     * 从二维数组中找key满足值的一条记录(影响)原来的数组会把满足条件的删掉
     * @param $data array
     * @param $key string
     * @param $value string|int
     * @return bool
     */
    public static function __getOneItem(&$data, $key, $value)
    {
        if (!is_array($data)) {
            return false;
        }
        foreach ($data as $key_=>$one) {
            if (isset($one[$key]) && $one[$key] === $value) {
                unset($data[$key_]);
                return $one;
            }
        }
        return array();
    }

    /**
     * 获取二维数组中满足字段条件的所有记录(不影响原来的值)
     * @param $data
     * @param $key
     * @param $value
     * @return array
     */
    public static function getAllItem($data, $key, $value)
    {
        if (!is_array($data)) {
            return false;
        }
        $r = array();
        foreach ($data as $k => $v) {
            if (isset($v[$key]) && $v[$key] === $value) {
                $r[] = $v;
            }
        }
        return $r;
    }

    /**
     * 获取二维数组中满足字段条件的所有记录(影响原来的值,会从传入的数据中删掉)
     * @param $data
     * @param $key
     * @param $value
     * @return array
     */
    public static function __getAllItem(&$data, $key, $value)
    {
        if (!is_array($data)) {
            return false;
        }
        $r = array();
        foreach ($data as $k => $v) {

            if (isset($v[$key]) && $v[$key] === $value) {
                unset($data[$k]);
                $r[] = $v;
            }
        }
        return $r;
    }

    /**
     * 获取一个二维数组中满足条件的所有记录(不影响原数据)
     * @param $data
     * @param $condition 键值对的形式
     * @return array|bool
     */
    public static function getAllByCondition($data, $condition)
    {
        if (!is_array($data) || !is_array($condition)) {
            return array();
        }
        $R = array();
        $num = count($condition);
        foreach ($data as $v) {
            //计算带索引的交集
            $c = array_intersect_assoc($v, $condition);
            if (is_array($c) && count($c) == $num) {
                $R[] = $v;
            }
        }
        return $R;
    }

    /**
     * 获取一个二维数组中满足条件的所有记录(影响原数据会从原数据中删除满足条件的)
     * @param $data
     * @param $condition 键值对的形式
     * @return array|bool
     */
    public static function __getAllByCondition(&$data, $condition)
    {
        if (!is_array($data) || !is_array($condition)) {
            return array();
        }
        $R = array();
        $num = count($condition);
        foreach ($data as $k=>$v) {
            //计算带索引的交集
            $c = array_intersect_assoc($v, $condition);
            if (is_array($c) && count($c) == $num) {
                unset($data[$k]);
                $R[] = $v;
            }
        }
        return $R;
    }

    /**
     * 对二维数组的多条件排序
     * 例子：arrayOrderBy($data,'volume',SORT_DESC)
     * @return array|bool
     */

    public static function arrayOrderBy()
    {
        $args = func_get_args();
        $data = array_shift($args);

        foreach ($args as $n => $field) {
            if (is_string($field)) {
                $tmp = array();
                foreach ($data as $key => $row) {
                    $tmp[$key] = $row[$field];
                }
                $args[$n] = $tmp;
            }
        }
        $args[] = &$data;
        call_user_func_array('array_multisort', $args);
        return array_pop($args);
    }

    /***********************
     **功能:将多维数组合并为一位数组
     **$array:需要合并的数组
     **$clearRepeated:是否清除并后的数组中得重复值
     ***********************/
    public static function array_multiToSingle($array,$clearRepeated=false){
        if(!isset($array)||!is_array($array)||empty($array)){
            return false;
        }
        if(!in_array($clearRepeated,array(true,false,''))){
            return false;
        }
        static $result_array=array();
        foreach($array as $value){
            if(is_array($value)){
                self::array_multiToSingle($value,$clearRepeated);
            }else{
                $result_array[]=$value;
            }
        }
        if($clearRepeated){
            $result_array=array_unique($result_array);
        }
        return $result_array;
    }
}